#ifndef __LYNX_EXCEPTION_C_HPP_INCLUDED__
#define __LYNX_EXCEPTION_C_HPP_INCLUDED__

#include "LynxException.hpp"

#define THROW_EXCEPTION(code, description) throw Exception_C(code, description, __FUNCTION__, __PRETTY_FUNCTION__, __FILE__, __LINE__)

namespace Lynx
{

class Exception_C : public Exception
{
public:
    Exception_C(LYNX_EXCEPTION_CODE code, const std::string &description, const std::string &short_function, const std::string &long_function, const std::string &file, uint32_t line) throw();

    Exception_C(const Exception_C &other) throw();

    virtual ~Exception_C() throw();

    void operator=(const Exception_C &other) throw();

    virtual LYNX_EXCEPTION_CODE get_exception_code(void) const throw();

    virtual uint32_t get_line(void) const throw();

    virtual const std::string &get_description(void) const throw();

    virtual const std::string &get_full_description(void) const throw();

    virtual const std::string &get_file(void) const throw();

    virtual const std::string &get_short_function(void) const throw();

    virtual const std::string &get_long_function(void) const throw();

    virtual const char *what(void) const throw();

protected:
    LYNX_EXCEPTION_CODE mCode;
    std::string mDescription;
    std::string mShortFunction;
    std::string mLongFunction;
    std::string mFile;
    uint32_t mLine;

    std::string mFullDescription;
};

} // namespace Lynx

#endif // __LYNX_EXCEPTION_C_HPP_INCLUDED__

